package venta;

import static org.junit.Assert.*;
import org.joda.time.DateTime;

import org.junit.Before;
import org.junit.Test;
//import org.mockito.stubbing.Answer;

import cliente.Cliente;
import producto.Pedido;
import producto.Producto;
import static org.mockito.Mockito.*;

public class VtaConEnvioTest {
	
	Producto productoMock01 = mock(Producto.class);
	Producto productoMock02 = mock(Producto.class);
	Cliente clienteMock01 = mock(Cliente.class);
	Pedido pedidoMock01 = mock(Pedido.class);
	
	VtaConEnvio venta01 = new VtaConEnvio(clienteMock01);

	
	@Before
	public void setUp(){
		
		((Venta)venta01).setPedido(pedidoMock01);
		when(pedidoMock01.precioDeVentaTotal()).thenReturn((double) 50);
		
		//Generar una venta con envio, pendiente
		//Pasa por cada estado
		//0.pendiente
		//1.enProceso
		//(opc)2.Reprogramada ?? vuelve a pendiente??
		//(opc)3.Cancelado
		//4.Finalizado
		
	}
	
	@Test
	public void testElementosSinStock() {
		when(pedidoMock01.elementosSinStock()).thenReturn(true);
		assertTrue(venta01.elementosSinStock());
	}
	
	@Test
	public void testProcesar(){
		venta01.setFechaDeEnvio(DateTime.now());
		venta01.procesar();
		assertTrue(venta01.getEstadoDeEnvio().enProceso());
	}
	
	/*unaQNoProcese
	@Test
	public void testProcesar2(){	
		venta01.procesar();
		assertFalse(venta01.getEstadoDeEnvio().enProceso());
	}
	*/
	
	/*
	@Test
	public void testProcesar3(){
		venta01.setFechaDeEnvio("unaFecha");
		venta01.agregarProducto(productoMock02);
		venta01.procesar();
		assertFalse(venta01.getEstadoDeEnvio().enProceso());
	}
	*/
	
	@Test
	public void esPendiente(){
		assertTrue(venta01.pendiente());
	}
	
	@Test
	public void testReprogramar(){	
		venta01.setFechaDeEnvio(DateTime.now());
		venta01.procesar();
		venta01.reprogramar();
		assertTrue(venta01.getEstadoDeEnvio().reprogramado());
	}
	
	@Test
	public void testReprogramarFalse(){	
		venta01.reprogramar();
		assertFalse(venta01.getEstadoDeEnvio().reprogramado());
	}
	
	@Test
	public void testNoProcesarUnaVentaReprogramada(){
		//false
		venta01.setFechaDeEnvio(DateTime.now());
		venta01.procesar();
		venta01.reprogramar();
		venta01.procesar();
		assertFalse(venta01.enProseso());
	}
	
	@Test
	public void testProcesarUnaVentaReprogramada(){
		//true
		venta01.setFechaDeEnvio(DateTime.now());
		venta01.procesar();
		venta01.reprogramar();
		venta01.setFechaDeEnvio(DateTime.now());
		venta01.procesar();
		assertTrue(venta01.enProseso());
	}
	
	@Test
	public void testAbonarInt(){
		venta01.abonar(10);
		assertEquals(40,venta01.montoRestante(),.01);
	}
	
	@Test 
	public void abonarMontoRestante(){
		//Pendiente
		assertTrue(venta01.pendiente());
		venta01.abonarMontoRestante();
		assertEquals(0,venta01.montoRestante(),.01);
	}
	
	@Test 
	public void abonarMontoRestante2(){
		//enProceso
		venta01.procesar();
		assertTrue(venta01.enProseso());
		assertEquals(50,venta01.montoRestante(),.01);
		venta01.abonarMontoRestante();
		assertEquals(0,venta01.montoRestante(),.01);
	}
	
	@Test
	public void finalizar(){
		venta01.setFechaDeEnvio(DateTime.now());
		venta01.procesar();
		venta01.abonarMontoRestante();
		assertTrue(venta01.enProseso());
		venta01.finalizar();
		assertTrue(venta01.finalizado());
	}
	
	
	@Test
	public void finalizar2(){
		venta01.confirmarVenta();
		assertFalse(venta01.finalizado());
	}
	
	/*
	@Test
	public void testCancelado(){
	}
	*/
	
	@Test
	public void TestPendiente(){
		venta01.setFechaDeEnvio(DateTime.now());
		venta01.procesar();
		assertFalse(venta01.pendiente());
	}
	
	@Test
	public void TestCanceladoFalse(){
		venta01.setFechaDeEnvio(DateTime.now());
		venta01.procesar();
		assertFalse(venta01.cancelado());
	}
	
	@Test
	public void testCancelarEnProceso(){	
		venta01.setFechaDeEnvio(DateTime.now());
		venta01.procesar();
		assertTrue(venta01.getEstadoDeEnvio().enProceso());
		venta01.cancelar();
		assertTrue(venta01.getEstadoDeEnvio().cancelado());
	}
	
	@Test
	public void testCancelar(){
		venta01.cancelar();
		assertTrue(venta01.getEstadoDeEnvio().cancelado());
	}
}
